package com.teamin.service;

import com.teamin.entity.CircleEntity;
import com.teamin.entity.CircleUserEntity;
import com.teamin.entity.NotifiEntity;
import com.teamin.entity.ShareInvite;
import com.teamin.vo.CircleVO;
import com.teamin.web.exception.GlobalErrorInfoException;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface CircleService {

    public  static final  int CAN_SHARE = 1 ;

	/**
     * 插入一个圈子 ID 会返回到 TaskEntity 中的circleId 中
     * @param  {circleName(必),createrId(必),img,descript}
     * @return 0 表示失败,1表示成功
	 * @throws GlobalErrorInfoException 
     */
    long insertCircle(CircleEntity record) throws GlobalErrorInfoException;

    /**
     * 查询用户所在的圈子列表 包含用户最后一条围度消息
     */
    List<CircleVO> selectUserCircleV012(Long userId,Long circleId);

    CircleVO selectCircleV012(long userId, long circleId);

    /**
     * 插入一个圈子 ID 会返回到 TaskEntity 中的circleId 中
     * @param  {circleName(必),createrId(必),img,descript}
     * @return 0 表示失败,1表示成功
     * @throws GlobalErrorInfoException 
     */
    CircleEntity addCircleEntity(CircleEntity record,Long userId) throws GlobalErrorInfoException;
    
    /**
     * 根据圈子的ID 查找圈子的详情
     * @param circleId
     * @return 圈子的详情信息
     * @throws GlobalErrorInfoException 
     */
    CircleEntity selectCircleById(Long circleId,Long userId) throws GlobalErrorInfoException;

    /**
     * 更新圈子的详细信息,选择更新
     *   circleId;     //圈子ID 必
     *   circleName;    //圈子名称
     *   img;     //圈子图标
     *   descript ;//圈子的描述
     *  @param record
     *  @param check 是否需要检查
     * @return
     * @throws GlobalErrorInfoException 
     */
    int updateCircle(CircleEntity record,boolean check,Long contolUser) throws GlobalErrorInfoException;

    /**
     * 圈子中添加成员,如果存在相同的circleId,跟userId 会出抛出异常
     * @param circleId 必
     * @param userId 必
     * @return 1 表示成功,0表示失败
     * @throws GlobalErrorInfoException 
     */
    int addMemberToCircle(long circleId,long userId) throws GlobalErrorInfoException;

    /**
     * 圈子中移除成员
     * @param circleId 必
     * @param userId 必
     * @return 1 表示成功,0表示失败
     * @throws GlobalErrorInfoException 
     */
    int removeMemberFromCircle(long circleId,long userId,Long controlUser,String userFlag) throws GlobalErrorInfoException;

    /**
     * 批量删除用户
     * @param circleId
     * @param userId
     * @return
     * @throws GlobalErrorInfoException
     */
    int removeMembersFromCircle(long circleId, String[] userId,Long controlUser,String userFlag) throws GlobalErrorInfoException;

    /**
     * 查看圈子中所有成员
     * @param circleId 必
     * @param userIds 指定的用户
     * @return 1 表示成功,0表示失败
     */
    List<CircleUserEntity> selectMemberToCircle(Long circleId,List<Long> userIds);

    CircleUserEntity selectMemberFromCircle(Long circleId, Long userId);

    /**
     * 查看用户所在的所有圈子
     * @param userId 必
     * @return 1 表示成功,0表示失败
     */
    List<CircleEntity> selectCircleByUser(long userId);

    /**
     * 查看用户所在的所有圈子
     * @param userId 必
     * @return 1 表示成功,0表示失败
     * @throws GlobalErrorInfoException 
     */
    List<CircleEntity> selectCircleAndUser(long userId) throws GlobalErrorInfoException;
    
    /**
     * 查询一个圈子
     * @param id
     * @return
     * @throws GlobalErrorInfoException
     */
	CircleEntity selectCircleWithUsersById(Long id,Long userId) throws GlobalErrorInfoException;
	 /**
     * 删除圈子
     * @param id
     * @return
	 * @throws GlobalErrorInfoException 
     */
    int deleteCircleById(Long id) throws GlobalErrorInfoException;
    
    /**
     * 圈子是否存在
     * @param circleId
     * @return
     */
	boolean circleExist(Long circleId);
	
	/**
	 * 圈子中的一个用户
	 * @param circleId
	 * @param userId
	 * @return
	 * @throws GlobalErrorInfoException
	 */
	CircleUserEntity selectMemberCircle(Long circleId, Long userId) throws GlobalErrorInfoException;

    /**
     * 获取要能通知的用户
     * @param circleId
     * @param userIds 指定的用户
     * @return
     * @throws GlobalErrorInfoException
     */
    List<NotifiEntity> selectNotifiMember(Long circleId, List<Long> userIds);

    /**
     * 获取圈子中第一个加入的成员ID
     * @param circleId 圈子ID
     * @return 成员ID
     */
    Long getFirstUserId(@Param("circleId") Long circleId) ;

    /**
     * 判断用户是不是圈子的创建者
     * @param circleId 圈子ID
     * @param userId 用户ID
     * @return
     */
    boolean isCreater(Long circleId, Long userId);

    /**
     * 修改圈子中用户的昵称
     * @param circleId 圈子ID
     * @param userId 用户ID
     * @return
     */
    boolean updateUser(Long circleId, Long userId,String nickName,String circlePhone,String circleEmail,String circleJob,Long controlUser,boolean isCreater);

    CircleEntity selectCircleByTask(@Param("taskId") Long taskId, @Param("userId") Long userId) ;

    Long selectMemberCount(Long circleId);

    String selectCircleName(Long circleId);

    int stickCircle(@Param("circleId") Long circleId, @Param("userId") Long userId, @Param("stick") Integer stick);

    String getUserName(Long circleId, Long userId);

    CircleEntity addUserToCircle(CircleEntity circle, Long circleId, Long loginUserId, ShareInvite json, String groupId,String userFlag) throws GlobalErrorInfoException;

    Long selectOnlyCircleIdByTask(Long taskId);

    Boolean existTask(Long circleId, Long taskId);
}
